import { isObejct, isProxy } from "./utils.js";
import createReactiveHandle, { ISREACTIVE } from "./reactiveHandle.js";
const proxyMap = new WeakMap();
export default function reactive(target) {
  if (!isObejct(target)) {
    // 仅对对象做响应式处理
    return target;
  }

  // 如果传入的target是代理对象
  if (isProxy(target)) {
    console.log(`target is already a proxy`);
    return target;
  }

  // 建立对象和代理对象的映射关系，防止重复代理
  if (proxyMap.has(target)) {
    return proxyMap.get(target);
  }

  const proxy = createReactive(target);

  // 存储对象和代理对象的映射关系
  proxyMap.set(target, proxy);

  // 返回一个代理对象，拦截对目标对象的操作
  return proxy;
}

export function shallowReactive(target) {
  if (!isObejct(target)) {
    // 仅对对象做响应式处理
    return target;
  }

  // 如果传入的target是代理对象
  if (isProxy(target)) {
    console.log(`target is already a proxy`);
    return target;
  }

  // 建立对象和代理对象的映射关系，防止重复代理
  if (proxyMap.has(target)) {
    return proxyMap.get(target);
  }

  const proxy = createReactive(target, true);

  // 存储对象和代理对象的映射关系
  proxyMap.set(target, proxy);

  // 返回一个代理对象，拦截对目标对象的操作
  return proxy;
}

export function createReactive(target, shallow = false) {
  target.__v_shallow__ = shallow;
  return new Proxy(target, createReactiveHandle());
}

export function isReactive(target) {
  return target[ISREACTIVE];
}
